﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using accesoDatos;
using clasesBase;
using Logica;

namespace PlanificacionProduccion
{
    public partial class FrmPlanillasDet : FrmABM
    {
        int idItemPlanificacion = 0, cantEstuchesObtenidos = 0;
        Producto objProducto;

        public Producto ObjProducto
        {
            set { this.objProducto = value; }
        }

        public int IdItemPlanificacion
        {
            set { this.idItemPlanificacion = value; }
        }

        public int CantEstuchesObtenidos
        {
            get { return this.cantEstuchesObtenidos; }
        }

        public FrmPlanillasDet()
        {
            InitializeComponent();
        }

        private void form_Load(object sender, System.EventArgs e)
        {
            lblProducto.Text = "";
            if (this.idElemento != 0) mostrarDatosPlanilla();
            else generarDatosPlanilla();
        }

        private void generarDatosPlanilla()
        {
            txtId.Text = "0";
            txtFecha.Text = DateTime.Today.ToString();
            txtResponsable.Text = Program.UsuarioActual; // Usuario actual del sistema

            if (this.objProducto != null)
            {
                txtNumeroLote.Text = ItemPlanificacionProduccion.proximoNumeroLote(this.objProducto.ID).ToString();

                lblProducto.Text = this.objProducto.Nombre.Trim();
                Formula formActual = this.objProducto.obtenerFormulaActual();

                // generar items planilla a partir de los ítems de la fórmula
                foreach (ItemFormula item in formActual.Items)
                    grillaItems.Rows.Add(0, item.ID, item.ObjFase.Nombre, item.NumeroOrden, item.ObjMateriaPrima.Nombre, item.Cantidad);

                // mostrar caracteristicas
                foreach (CaractLoteProducto caract in objProducto.Caracteristicas)
                    grillaCaracteristicas.Rows.Add(0, caract.ObjCaracteristica.ID, caract.ObjCaracteristica.Nombre, caract.CantidadEstimada);

                // mostrar instrucciones (que están en la fórmula del producto)
                foreach (InstruccionFormula instr in formActual.Instrucciones)
                    grillaInstrucciones.Rows.Add(0, instr.ID, instr.Descripcion);
            }
        }

        private void mostrarDatosPlanilla()
        {
            PlanillaProduccion elem = new PlanillaProduccion(base.idElemento);

            txtId.Text = elem.ID.ToString();
            lblProducto.Text = this.objProducto != null ? this.objProducto.Nombre.Trim() : "";
            txtFecha.Text = elem.Fecha.ToString();
            txtNumeroLote.Text = elem.NumeroLote.ToString();
            txtResponsable.Text = elem.Responsable.Trim();
            txtCantEstuches.Text = elem.CantEstuchesObtenidos.ToString();

            // Mostrar ítems de la planilla (cada ítem de la fórmula del producto)
            foreach (ItemPlanilla item in elem.Items)
                grillaItems.Rows.Add(item.ID, item.ObjItemFormula.ID, item.ObjItemFormula.ObjFase.Nombre, item.ObjItemFormula.NumeroOrden, item.ObjItemFormula.ObjMateriaPrima.Nombre, item.ObjItemFormula.Cantidad, item.CantidadModificada);
            
            // mostrar caracteristicas
            foreach (CaractLoteProductoPlanilla caract in elem.Caracteristicas)
                grillaCaracteristicas.Rows.Add(caract.ID, caract.ObjCaractLoteProd.ObjCaracteristica.ID, caract.ObjCaractLoteProd.ObjCaracteristica.Nombre, caract.ObjCaractLoteProd.CantidadEstimada, caract.CantidadModificada);

            // mostrar instrucciones
            foreach (InstruccionPlanilla instr in elem.Instrucciones)
                grillaInstrucciones.Rows.Add(instr.ID, instr.ObjInstruccionFormula.ID, instr.ObjInstruccionFormula.Descripcion);
        }

        private bool camposCompletos()
        {
            bool completos = true;

            if (txtFecha.Text.Trim() == "") { completos = false; lblFecha.ForeColor = Color.Red; }
            if (txtResponsable.Text.Trim() == "") { completos = false; lblResponsable.ForeColor = Color.Red; }
            if (txtNumeroLote.Text.Trim() == "") { completos = false; lblNumero.ForeColor = Color.Red; }
            if (txtCantEstuches.Text.Trim() == "") { completos = false; lblCantEstuches.ForeColor = Color.Red; }

            return completos;
        }

        private void quitarResaltado()
        {
            lblFecha.ForeColor = Color.Black;
            lblResponsable.ForeColor = Color.Black;
            lblNumero.ForeColor = Color.Black;
            lblCantEstuches.ForeColor = Color.Black;
        }

        private void btnGuardar_Click(object sender, System.EventArgs e)
        {
            quitarResaltado();
            if (camposCompletos())
            {
                if (Notificador.accionGuardarConfirmada())
                {
                    // Si se tratase de un elemento nuevo, el id correspondiente es 0.
                    int idElemento = txtId.Text.Trim() == "" ? 0 : Convert.ToInt32(txtId.Text);

                    PlanillaProduccion elem = new PlanillaProduccion(idElemento);
                    elem.Fecha = Convert.ToDateTime(txtFecha.Text);
                    elem.IdItemPlanificacionProduccion = this.idItemPlanificacion;
                    elem.NumeroLote = txtNumeroLote.Text.Trim() == "" ? 0 : Convert.ToInt32(txtNumeroLote.Text);
                    elem.Responsable = txtResponsable.Text.Trim();
                    elem.CantEstuchesObtenidos = txtCantEstuches.Text.Trim() == "" ? 0 : Convert.ToInt32(txtCantEstuches.Text);

                    elem.Items = obtenerItemsPlanilla();
                    elem.Caracteristicas = obtenerCaracteristicasPlanilla();
                    elem.Instrucciones = obtenerInstruccionesPlanilla();

                    // Guardo la información
                    string error = elem.guardar();
                    Notificador.resultadoABM(idElemento == 0 ? TipoOperacionABM.ALTA : TipoOperacionABM.MODIFICACION, error);
                    if (error.Trim() == "") this.Close();
                }
            }
            else Notificador.camposNoCompletos();
        }

        private List<ItemPlanilla> obtenerItemsPlanilla()
        {
            List<ItemPlanilla> items = new List<ItemPlanilla>();
            foreach (DataGridViewRow fila in grillaItems.Rows)
            {
                int idItem = Convert.ToInt32(fila.Cells["colIdItemPlanilla"].Value);
                ItemPlanilla item = new ItemPlanilla(idItem);
                item.IdPlanilla = txtId.Text.Trim() == "" ? 0 : Convert.ToInt32(txtId.Text);
                item.IdItemFormula = Convert.ToInt32(fila.Cells["colIdItemFormula"].Value);
                
                decimal cantidad;
                if (fila.Cells["colCantModificada"].Value == null || fila.Cells["colCantModificada"].Value.ToString() == "") cantidad = 0;
                else cantidad = Convert.ToDecimal(fila.Cells["colCantModificada"].Value);
                item.CantidadModificada = cantidad;

                items.Add(item);
            }

            return items;
        }

        private List<CaractLoteProductoPlanilla> obtenerCaracteristicasPlanilla()
        {
            List<CaractLoteProductoPlanilla> caracteristicas = new List<CaractLoteProductoPlanilla>();
            foreach (DataGridViewRow fila in grillaCaracteristicas.Rows)
            {
                int idCaractPlanilla = Convert.ToInt32(fila.Cells["colIdCaractLotePlanilla"].Value);
                CaractLoteProductoPlanilla item = new CaractLoteProductoPlanilla(idCaractPlanilla);
                item.IdPlanilla = txtId.Text.Trim() == "" ? 0 : Convert.ToInt32(txtId.Text);
                item.IdCaracteristicaLoteProducto = Convert.ToInt32(fila.Cells["colIdCaracteristica"].Value);
                item.CantidadModificada = fila.Cells["colCantModificadaCaract"].Value != null ? fila.Cells["colCantModificadaCaract"].Value.ToString() : "";

                caracteristicas.Add(item);
            }

            return caracteristicas;
        }

        private List<InstruccionPlanilla> obtenerInstruccionesPlanilla()
        {
            List<InstruccionPlanilla> items = new List<InstruccionPlanilla>();
            foreach (DataGridViewRow fila in grillaInstrucciones.Rows)
            {
                int idInstruccion = Convert.ToInt32(fila.Cells["colIdInstruccionPlanilla"].Value);
                InstruccionPlanilla instruccion = new InstruccionPlanilla(idInstruccion);
                instruccion.IdPlanilla = txtId.Text.Trim() == "" ? 0 : Convert.ToInt32(txtId.Text);
                instruccion.IdInstruccionFormula = Convert.ToInt32(fila.Cells["colIdInstruccion"].Value);

                items.Add(instruccion);
            }

            return items;
        }

        private void grillaItems_KeyPress(object sender, KeyPressEventArgs e)
        {
            bool validarEntrada = false;
            DataGridView grilla = (DataGridView)sender;
            switch (grilla.Name)
            { 
                case "grillaItems":
                    if (grilla.CurrentCell.ColumnIndex == 6) validarEntrada = true;
                    break;

                case "grillaCaracteristicas":
                    if (grilla.CurrentCell.ColumnIndex == 4) validarEntrada = true;
                    break;
            }

            if (validarEntrada) Validador.soloEnteros_KeyPress(sender, e);
        }

        private void grilla_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            bool validarEntrada = false;
            DataGridView grilla = (DataGridView)sender;
            switch (grilla.Name)
            {
                case "grillaItems":
                    if (grilla.CurrentCell.ColumnIndex == 6) validarEntrada = true;
                    break;

                //case "grillaCaracteristicas":
                //    if (grilla.CurrentCell.ColumnIndex == 4) validarEntrada = true;
                //    break;
            }

            TextBox txt;
            if (e.Control is TextBox) txt = e.Control as TextBox;
            else txt = null;

            if (txt != null)
            {
                if (validarEntrada) txt.KeyPress += Validador.soloDecimales_KeyPress;
                else txt.KeyPress -= Validador.soloDecimales_KeyPress;
            }
        }
    }
}
